# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

exports_files(["LICENSE.TXT"])

# It may be tempting to add compiler flags here, but that should be avoided.
# The necessary warnings and other compile flags should be provided by the
# toolchain or the `.bazelrc` file. This is just a workaround until we have a
# widely available feature to enable unlimited stack frame instead of using
# this `Make` variable.
llvm_copts = [
    "$(STACK_FRAME_UNLIMITED)",
]

# A hacky library to expose some internal headers of gtest to its own
# implementation source files using a stripped include prefix rather than
# file-relative-inclusion.
#
# FIXME: This file should be in `textual_hdrs` instead of `hdrs`, but
# unfortunately that doesn't work with `strip_include_prefix`:
# https://github.com/bazelbuild/bazel/issues/12424
#
# For now, simply disable parsing and header modules.
cc_library(
    name = "gtest_internal_headers",
    testonly = True,
    hdrs = ["googletest/src/gtest-internal-inl.h"],
    features = [
        "-parse_headers",
        "-header_modules",
    ],
    strip_include_prefix = "googletest",
)

cc_library(
    name = "gtest",
    testonly = True,
    srcs = glob(
        [
            "googletest/include/**/*.h",
            "googletest/src/*.cc",
        ],
        exclude = [
            "googletest/src/gtest-all.cc",
            "googletest/include/gtest/gtest_pred_impl.h",
        ],
    ) + [
    ],
    hdrs = ["googletest/include/gtest/gtest.h", "googletest/include/gtest/gtest-spi.h"],
    copts = llvm_copts,
    defines = [
        "GTEST_HAS_RTTI=0",
        "__STDC_LIMIT_MACROS",
        "__STDC_CONSTANT_MACROS",
    ] + select({
        "@bazel_tools//src/conditions:windows": ["GTEST_USE_OWN_TR1_TUPLE=0"],
        "//conditions:default": ["GTEST_USE_OWN_TR1_TUPLE=1"],
    }),
    includes = [
        "googletest/include",
        "include",
    ],
    textual_hdrs = [
        "googletest/include/gtest/gtest_pred_impl.h",
    ],
    deps = [
        ":gtest_internal_headers",
        "//llvm:Support",
    ],
)

cc_library(
    name = "gtest_main",
    testonly = True,
    srcs = ["UnitTestMain/TestMain.cpp"],
    copts = llvm_copts,
    deps = [
        ":gmock",
        ":gtest",
        "//llvm:Support",
    ],
)

cc_library(
    name = "gmock",
    testonly = True,
    srcs = glob(
        [
            "googlemock/include/**/*.h",
            "googlemock/src/*.cc",
        ],
        exclude = ["googlemock/src/gmock-all.cc"],
    ),
    hdrs = [
        "googlemock/include/gmock/gmock.h",
        "googlemock/include/gmock/gmock-matchers.h",
    ],
    copts = llvm_copts,
    includes = [
        "googlemock/include",
        "include",
    ],
    deps = [":gtest"],
)
